﻿package org.papervision3d.core.math.util
{

    public class GLU extends Object
    {

        public function GLU()
        {
            return;
        }// end function

        public static function unProject(param1:Number, param2:Number, param3:Number, param4:Array, param5:Array, param6:Array, param7:Array) : Boolean
        {
            var _loc_8:* = new Array(16);
            var _loc_9:* = new Array(4);
            multMatrices(param4, param5, _loc_8);
            if (!invertMatrix(_loc_8, _loc_8))
            {
                return false;
            }// end if
            _loc_9[0] = param1;
            _loc_9[1] = param2;
            _loc_9[2] = param3;
            _loc_9[3] = 1;
            _loc_9[0] = (_loc_9[0] - param6[0]) / param6[2];
            _loc_9[1] = (_loc_9[1] - param6[1]) / param6[3];
            _loc_9[0] = (_loc_9[0] * 2)--;
            _loc_9[1] = (_loc_9[1] * 2)--;
            _loc_9[2] = (_loc_9[2] * 2)--;
            multMatrixVec(_loc_8, _loc_9, param7);
            if (param7[3] == 0)
            {
                return false;
            }// end if
            param7[0] = param7[0] / param7[3];
            param7[1] = param7[1] / param7[3];
            param7[2] = param7[2] / param7[3];
            return true;
        }// end function

        public static function scale(param1:Array, param2:Number, param3:Number, param4:Number) : void
        {
            makeIdentity(param1);
            param1[0] = param2;
            param1[5] = param3;
            param1[10] = param4;
            return;
        }// end function

        public static function multMatrixVec(param1:Array, param2:Array, param3:Array) : void
        {
            var _loc_4:int;
            _loc_4 = 0;
            while (_loc_4 < 4)
            {
                // label
                param3[_loc_4] = param2[0] * param1[int(0 * 4 + _loc_4)] + param2[1] * param1[int(1 * 4 + _loc_4)] + param2[2] * param1[int(2 * 4 + _loc_4)] + param2[3] * param1[int(3 * 4 + _loc_4)];
                _loc_4++;
            }// end while
            return;
        }// end function

        public static function invertMatrix(param1:Array, param2:Array) : Boolean
        {
            var _loc_3:int;
            var _loc_4:int;
            var _loc_5:int;
            var _loc_6:int;
            var _loc_7:Number;
            var _loc_8:* = new Array(4);
            _loc_3 = 0;
            while (_loc_3 < 4)
            {
                // label
                _loc_8[_loc_3] = new Array(4);
                _loc_4 = 0;
                while (_loc_4 < 4)
                {
                    // label
                    _loc_8[_loc_3][_loc_4] = param1[_loc_3 * 4 + _loc_4];
                    _loc_4++;
                }// end while
                _loc_3++;
            }// end while
            makeIdentity(param2);
            _loc_3 = 0;
            while (_loc_3 < 4)
            {
                // label
                _loc_6 = _loc_3;
                _loc_4 = _loc_3 + 1;
                while (_loc_4 < 4)
                {
                    // label
                    if (Math.abs(_loc_8[_loc_4][_loc_3]) > Math.abs(_loc_8[_loc_3][_loc_3]))
                    {
                        _loc_6 = _loc_4;
                    }// end if
                    _loc_4++;
                }// end while
                if (_loc_6 != _loc_3)
                {
                    _loc_5 = 0;
                    while (_loc_5 < 4)
                    {
                        // label
                        _loc_7 = _loc_8[_loc_3][_loc_5];
                        _loc_8[_loc_3][_loc_5] = _loc_8[_loc_6][_loc_5];
                        _loc_8[_loc_6][_loc_5] = _loc_7;
                        _loc_7 = param2[_loc_3 * 4 + _loc_5];
                        param2[_loc_3 * 4 + _loc_5] = param2[_loc_6 * 4 + _loc_5];
                        param2[_loc_6 * 4 + _loc_5] = _loc_7;
                        _loc_5++;
                    }// end while
                }// end if
                if (_loc_8[_loc_3][_loc_3] == 0)
                {
                    return false;
                }// end if
                _loc_7 = _loc_8[_loc_3][_loc_3];
                _loc_5 = 0;
                while (_loc_5 < 4)
                {
                    // label
                    _loc_8[_loc_3][_loc_5] = _loc_8[_loc_3][_loc_5] / _loc_7;
                    param2[_loc_3 * 4 + _loc_5] = param2[_loc_3 * 4 + _loc_5] / _loc_7;
                    _loc_5++;
                }// end while
                _loc_4 = 0;
                while (_loc_4 < 4)
                {
                    // label
                    if (_loc_4 != _loc_3)
                    {
                        _loc_7 = _loc_8[_loc_4][_loc_3];
                        _loc_5 = 0;
                        while (_loc_5 < 4)
                        {
                            // label
                            _loc_8[_loc_4][_loc_5] = _loc_8[_loc_4][_loc_5] - _loc_8[_loc_3][_loc_5] * _loc_7;
                            param2[_loc_4 * 4 + _loc_5] = param2[_loc_4 * 4 + _loc_5] - param2[_loc_3 * 4 + _loc_5] * _loc_7;
                            _loc_5++;
                        }// end while
                    }// end if
                    _loc_4++;
                }// end while
                _loc_3++;
            }// end while
            return true;
        }// end function

        public static function ortho(param1:Array, param2:Number, param3:Number, param4:Number, param5:Number, param6:Number, param7:Number) : Boolean
        {
            var _loc_8:* = (param3 + param2) / (param3 - param2);
            var _loc_9:* = (param4 + param5) / (param4 - param5);
            var _loc_10:* = (param7 + param6) / (param7 - param6);
            makeIdentity(param1);
            param1[0] = 2 / (param3 - param2);
            param1[5] = 2 / (param4 - param5);
            param1[10] = -2 / (param7 - param6);
            param1[12] = _loc_8;
            param1[13] = _loc_9;
            param1[14] = _loc_10;
            return true;
        }// end function

        public static function multMatrices(param1:Array, param2:Array, param3:Array) : void
        {
            var _loc_4:int;
            var _loc_5:int;
            _loc_4 = 0;
            while (_loc_4 < 4)
            {
                // label
                _loc_5 = 0;
                while (_loc_5 < 4)
                {
                    // label
                    param3[int(_loc_4 * 4 + _loc_5)] = param1[int(_loc_4 * 4 + 0)] * param2[int(0 * 4 + _loc_5)] + param1[int(_loc_4 * 4 + 1)] * param2[int(1 * 4 + _loc_5)] + param1[int(_loc_4 * 4 + 2)] * param2[int(2 * 4 + _loc_5)] + param1[int(_loc_4 * 4 + 3)] * param2[int(3 * 4 + _loc_5)];
                    _loc_5++;
                }// end while
                _loc_4++;
            }// end while
            return;
        }// end function

        public static function perspective(param1:Array, param2:Number, param3:Number, param4:Number, param5:Number) : Boolean
        {
            var _loc_6:Number;
            var _loc_7:Number;
            var _loc_8:Number;
            var _loc_9:* = param2 / 2 * (Math.PI / 180);
            _loc_8 = param5 - param4;
            _loc_6 = Math.sin(_loc_9);
            if (_loc_8 == 0 || _loc_6 == 0 || param3 == 0)
            {
                return false;
            }// end if
            _loc_7 = Math.cos(_loc_9) / _loc_6;
            makeIdentity(param1);
            param1[0] = _loc_7 / param3;
            param1[5] = _loc_7;
            param1[10] = (-(param5 + param4)) / _loc_8;
            param1[11] = -1;
            param1[14] = (-2 * param4 * param5) / _loc_8;
            param1[15] = 0;
            return true;
        }// end function

        public static function makeIdentity(param1:Array) : void
        {
            param1[0 + 4 * 0] = 1;
            param1[0 + 4 * 1] = 0;
            param1[0 + 4 * 2] = 0;
            param1[0 + 4 * 3] = 0;
            param1[1 + 4 * 0] = 0;
            param1[1 + 4 * 1] = 1;
            param1[1 + 4 * 2] = 0;
            param1[1 + 4 * 3] = 0;
            param1[2 + 4 * 0] = 0;
            param1[2 + 4 * 1] = 0;
            param1[2 + 4 * 2] = 1;
            param1[2 + 4 * 3] = 0;
            param1[3 + 4 * 0] = 0;
            param1[3 + 4 * 1] = 0;
            param1[3 + 4 * 2] = 0;
            param1[3 + 4 * 3] = 1;
            return;
        }// end function

    }
}
